package main

import "fmt"

// PayStrategy
// @Description: 策略模式
type PayStrategy struct {
	pay Pay
}

// SetPay
//
//	@Description: 设置支付方式
//	@receiver p
//	@param pay
func (p *PayStrategy) SetPay(pay Pay) {
	p.pay = pay
}

// Pay
//
//	@Description: 调用支付-
//	@receiver p
//	@param money
func (p *PayStrategy) Pay(money int64) {
	p.pay.Pay(money)
}

// Pay
// @Description: 支付接口
type Pay interface {
	Pay(money int64)
}

// AliPay
// @Description: 支付实现类
type AliPay struct {
}

func (AliPay) Pay(money int64) {
	fmt.Println("使用支付宝支付", money)
}

// WeiPay
// @Description: 支付实现类
type WeiPay struct {
}

func (WeiPay) Pay(money int64) {
	fmt.Println("使用微信支付", money)
}

// main
//
//	@Description: 它定义了一系列算法，并将每个算法封装起来，使它们可以互相替换。策略模式的核心思想是将算法的使用与算法的实现分离，从而使得算法可以独立于客户端而变化。
//
// 通过策略模式，可以在运行时动态地选择算法，而不需要修改客户端代码。
func main() {
	aliPay := &AliPay{}
	weiPay := &WeiPay{}

	payStrategy := &PayStrategy{}
	payStrategy.SetPay(aliPay)
	payStrategy.Pay(12)
	payStrategy.SetPay(weiPay)
	payStrategy.Pay(12)

}
